package interview;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

import interview.InterViewVo;

public class InterView {
	
	//------------------------------------------------
		//         JDBC 연결
		//------------------------------------------------
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; 
		String db_user = "hr";
		String db_pwd = "hr";

		Connection conn;
		
		InterViewVo vo;
	
		
		int listSize = 10;  // 한 페이지에 보여질 행수를 설정하는 부분
		int blockSize = 5; // 제일 하단에 표시하는 페이지 번호
		
		int totSize = 0;   // 검색된 데이터 총 갯수
		int totPage = 0;   // 전체 페이지수를 나타낸다.
		int totBlock = 0;
		
		int nowPage = 1;   // 현제 보고 있는 페이지를 나타낸다.
		int nowBlock = 1;  // 현재 블럭을 표시
		
		int startNo = 1;   // 목록의 시작 위치를 표시
		int endNo = 3;     // 목록의 끝 위치를 표시
		
		int startPage = 1; // 현재 블록의 시작 페이지번호
		int endPage = 2;   // 현재 블록의 끝 페이지 번호
		
		
	public InterView(){
		try {
			// 1) 드라이버 로딩
			Class.forName(driver).newInstance();
			
			// 2) Connection 객체 생성
			conn = DriverManager.getConnection(url, db_user, db_pwd);
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
	}

	public InterViewVo getVo() {
		return vo;
	}

	public void setVo(InterViewVo vo) {
		this.vo = vo;
	}
	
	
	
	public Vector<InterViewVo> list(){

		Vector<InterViewVo> v = new Vector<>();
		String sql = "";
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try{
		
		// 전체 페이지 수 계산 할 부분
		sql = "select count(serial) cnt from interview where (mid like ? or subject like ? or content like ?)";
		
		ps = conn.prepareStatement(sql);
		
		ps.setString(1, "%" + vo.getMid() + "%");
		ps.setString(2, "%" + vo.getSubject() + "%");
		ps.setString(3, "%" + vo.getContent() + "%");
		
		rs = ps.executeQuery();
		rs.next();
		
		totSize = rs.getInt("cnt");
		compute();
	
			
			
		// part 에 따라서 게시글을 뿌려주기 위해서 mid, subject, content 는 논리적으로 묶어준다.
		sql = "select * from("
					+ "select rownum no, a.* from ("
					+ "select * from interview where mid like ? or subject like ? or content like ?"
					+ "order by serial desc)a "
					+ ") where no between ? and ?";
		
		ps = conn.prepareStatement(sql);
		
		ps.setString(1, "%" + vo.getFind() + "%");
		ps.setString(2, "%" + vo.getFind() + "%");
		ps.setString(3, "%" + vo.getFind() + "%");
		ps.setInt(4, startNo);
		ps.setInt(5, endNo);
		
		rs = ps.executeQuery();
		
		while(rs.next()){
			InterViewVo vo = new InterViewVo();
			
			vo.setSerial(rs.getInt("serial"));
			vo.setMid(rs.getString("mid"));
			vo.setSubject(rs.getString("subject"));
			vo.setContent(rs.getString("content"));
			vo.setMdate(rs.getDate("mdate"));

			v.add(vo);
		}
		
		rs.close();
		ps.close();
		conn.close();
		
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return v;
	}
	
	// 페이지 수, 블록 수 등을 계산하기 위해서
	public void compute(){
		// ceil은 반환타입이 long type 이라서 정수형으로 바꿔주고 1.0을 곱해야 한다.
		// 전체 페이지 수 계산
		totPage = (int)Math.ceil(totSize*1.0 / listSize);
		// 총 블록 수 계산
		totBlock = (int)Math.ceil(totPage*1.0 / blockSize);
		// 현재 블록을 표시
		nowBlock = (int)Math.ceil(nowPage*1.0 / blockSize);
		
		// 가장 끝 페이지를 표시하는데 가장 끝 페이지가 전체 페이지수를 넘어버릴 수 있기 때문에 예외처리한다.
		endPage = nowBlock * blockSize;
		startPage = endPage - blockSize + 1;
		if(totPage < endPage) endPage = totPage;
		
		endNo = nowPage * listSize;
		startNo = endNo - listSize + 1;
		if(totSize < endNo) endNo = totSize;
	}
	
	
	
	public InterViewVo view(){
		InterViewVo v = null;
		String sql = "select * from interview where serial=?";
		
		try{
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setInt(1, vo.getSerial());
			
			ResultSet rs = ps.executeQuery();
			
			if(rs.next()){
				v = new InterViewVo();
				v.setSerial(rs.getInt("serial"));
				v.setMid(rs.getString("mid"));
				v.setSubject(rs.getString("subject"));
				v.setContent(rs.getString("content"));
			}
			
			rs.close();
			ps.close();
			conn.close();
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return v;
	}
	
	public boolean insert(){
		boolean flag = false;
		
		String sql = "insert into interview(serial, mid, subject, content, mdate) values(seq_serial.nextval, ?, ?, ?, sysdate)";
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ps.setString(1, vo.getMid());
			ps.setString(2, vo.getSubject());
			ps.setString(3, vo.getContent());
			
			int cnt = ps.executeUpdate();
			if(cnt>0) flag = true;
			
			conn.close();
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return flag;
	}
	
	public boolean modify(){
		boolean flag = false;
		
		String sql = "update interview set subject=?, content=? where serial = ?";
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ps.setString(1, vo.getSubject());
			ps.setString(2, vo.getContent());
			ps.setInt(3, vo.getSerial());
			 
			
			int cnt = ps.executeUpdate();
			if(cnt>0) flag = true;
			
			conn.close();
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return flag;
	}
	
	
	// 페이지 분리와 관련된 메서드
	
		public int getListSize() {
			return listSize;
		}

		public void setListSize(int listSize) {
			this.listSize = listSize;
		}

		public int getBlockSize() {
			return blockSize;
		}

		public void setBlockSize(int blockSize) {
			this.blockSize = blockSize;
		}

		public int getTotSize() {
			return totSize;
		}

		public void setTotSize(int totSize) {
			this.totSize = totSize;
		}

		public int getTotPage() {
			return totPage;
		}

		public void setTotPage(int totPage) {
			this.totPage = totPage;
		}

		public int getNowPage() {
			return nowPage;
		}

		public void setNowPage(int nowPage) {
			this.nowPage = nowPage;
		}

		public int getNowBlock() {
			return nowBlock;
		}

		public void setNowBlock(int nowBlock) {
			this.nowBlock = nowBlock;
		}

		public int getStartNo() {
			return startNo;
		}

		public void setStartNo(int startNo) {
			this.startNo = startNo;
		}

		public int getEndNo() {
			return endNo;
		}

		public void setEndNo(int endNo) {
			this.endNo = endNo;
		}

		public int getStartPage() {
			return startPage;
		}

		public void setStartPage(int startPage) {
			this.startPage = startPage;
		}

		public int getEndPage() {
			return endPage;
		}

		public void setEndPage(int endPage) {
			this.endPage = endPage;
		}
		
		public int getTotBlock() {
			return totBlock;
		}

		public void setTotBlock(int totBlock) {
			this.totBlock = totBlock;
		}
	
}
